import {
  Column,
  CreateDateColumn,
  Entity,
  JoinColumn,
  ManyToOne,
  OneToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';

import { User, Punch } from '@/modules/app/entities';
import { IsEnum, IsNumber } from 'class-validator';
import { ApiHideProperty } from '@nestjs/swagger';

export enum PointType {
  /**
   * 每日签到积分
   */
  DAILY_CHECKIN = 'DAILY_CHECKIN',
  /**
   * 用餐打卡积分
   */
  MEAL_LOG = 'MEAL_LOG',
  /**
   * 内容分享积分
   */
  CONTENT_SHARE = 'CONTENT_SHARE',
}

/**
 * * 积分表
 */
// 简单来说，joinColumn （外键）放在谁上，谁就有外键，就必须指向某个地方，不放外键的那个表绑定的数据可以为 null
// 谁附属放在谁上
@Entity('points')
export class Point {
  /**
   * 积分ID
   */
  @PrimaryGeneratedColumn('increment')
  pointId: number;

  /**
   * 积分数值
   */
  @IsNumber()
  @Column({ type: 'int' })
  count: number;

  /**
   * 积分类型
   * DAILY_CHECKIN: 每日签到积分
   * MEAL_LOG: 用餐打卡积分
   * CONTENT_SHARE: 内容分享积分
   */
  @IsEnum(PointType)
  @Column({
    type: 'enum',
    enum: PointType,
  })
  pointType: PointType;

  /**
   * 用户ID
   */
  @IsNumber()
  @Column()
  userId: number;

  @ApiHideProperty()
  @ManyToOne(() => User, (user) => user.messages, { onDelete: 'CASCADE' })
  @JoinColumn({ name: 'userId' })
  user?: User;

  // 显示维护的 punchId
  @Column({
    nullable: true,
  })
  punchId?: number;

  @OneToOne(() => Punch, (punch) => punch.point)
  punch?: Punch;

  @CreateDateColumn()
  createdAt?: Date;
}
